GDK W32: send both smooth and discrete scrolling events
authorРуслан Ижбулатов <lrn1986@gmail.com>
Wed, 12 Sep 2018 06:55:49 +0000 (06:55 +0000)
committerРуслан Ижбулатов <lrn1986@gmail.com>
Tue, 18 Sep 2018 13:52:35 +0000 (13:52 +0000)
Commit d64467b33475bf8358f66bec9450101f37c05e9c changed the
code to send GDK_SCROLL_SMOOTH with deltas instead of
GDK_SCROLL_(UP|DOWN|LEFT|RIGHT). Change it again, to send
both the GDK_SCROLL_SMOOTH and the GDK_SCROLL_(UP|DOWN|LEFT|RIGHT)
event separately (with the discrete event marked as emulated),
as this is what other backends (such as wayland) do.

gdk/win32/gdkevents-win32.c

index 6eed24329f5634bcbac29a1a93c02f66dc39b8ff..ad05ee6314f55a5040303f0a4a200f513a6ef2c7 100644 (file)
@@ -2749,6 +2749,20 @@ gdk_event_translate (MSG  *msg,
       event->scroll.state = build_pointer_event_state (msg);
       gdk_event_set_device (event, device_manager_win32->core_pointer);
       gdk_event_set_source_device (event, device_manager_win32->system_pointer);
+      gdk_event_set_pointer_emulated (event, FALSE);
+
+      _gdk_win32_append_event (gdk_event_copy (event));
+
+      /* Append the discrete version too */
+      if (msg->message == WM_MOUSEWHEEL)
+       event->scroll.direction = (((short) HIWORD (msg->wParam)) > 0) ?
+         GDK_SCROLL_UP : GDK_SCROLL_DOWN;
+      else if (msg->message == WM_MOUSEHWHEEL)
+       event->scroll.direction = (((short) HIWORD (msg->wParam)) > 0) ?
+         GDK_SCROLL_RIGHT : GDK_SCROLL_LEFT;
+      event->scroll.delta_x = 0;
+      event->scroll.delta_y = 0;
+      gdk_event_set_pointer_emulated (event, TRUE);
 
       _gdk_win32_append_event (event);